In diesem Kapitel schauen wir uns Funktionen in JavaScript an. Was sind Funktionen in JavaScript? In JavaScript sind Funktionen Objekte! Das ist auf den ersten Blick etwas ungewöhnlich. Sie können über Variablen referenziert werden. Sie können an andere Funktionen übergeben werden. Die Deklaration einer Funktion erfolgt mit dem Schlüsselwort "function" oder mit dem speziellen Konstruktor "Function". Der Aufruf einer Funktion erfolgt über ihren Namen oder über eine Variable, die auf die Funktion zeigt oder über die "apply"-Methode, die jede Funktion hat. Die Parameterübergabe erfolgt wie in Java: "call-by-value": Eine Kopie der Parameter wird angelegt. Formale Parameter sind lokale Variablen. Bei Objekten wird die Referenz kopiert, nicht das Objekt. Besonderheiten bei der Rückgabe von Werten sind: Der Rückgabeparameter wird in JavaScript nicht deklariert. Die Rückgabe erfolgt dann über das Schlüsselwort "return". Funktionen können wiederum Funktionen enthalten. Es gibt verschiedene Möglichkeiten, wie man eine neue Funktion deklarieren kann. Da wäre zunächst die einfache Deklaration. Bei einem benannten Funktionsausdruck (named function expression) bekommt die Funktion sofort auch eine Referenz auf sich. Eine anonyme Funktion (anonymous function) hat keinen Namen, sondern nur die Referenz auf sich. Bei der Deklaration und dem benannten Funktionsausdruck kann über die Property "name" der Name der Funktion ausgelesen werden. Dies ist jedoch nicht gemäß ECMA-Standard. Hier sehen wir drei verschiedene konkrete Beispiele, wie man Funktionen in JavaScript deklarieren kann. Über die "name"-Eigenschaft werden die Namen der Funktionen dann im HTML-Code ausgegeben. Probieren Sie es aus! Ähnlich wie in Java wird hier nun eine einfache "print line"-Funktion mit einem Parameter definiert. Die Funktion wird dann zweimal ausgeführt. Bei der Deklaration einer Funktion gibt es in JavaScript feine Unterschiede. Deklarierte Funktionen sind auch vor der Deklaration schon sichtbar. Anonyme und benannte Funktionen sind erst ab der Zuweisung sichtbar. Hier sehen Sie drei verschiedene Wege, um die Funktion "add" mit zwei Eingabeparametern und einem Rückgabeparameter zu definieren. Zuerst über eine einfache Deklaration. Dann als benannter Funktionsausdruck. Und abschließend über den Funktions-Konstruktor. Auf dieser Folie sehen Sie die "add"-Funktion einfach deklariert. Die "sub"-Funktion ist eine anonyme Funktion. Danach sehen Sie, wie die Zuweisung der beiden Funktionsobjekte "add" und "sub" zu den Referenzen "subtract" und "addiere" funktioniert. Und abschließend sehen Sie, wie die Funktionen nun konkret aufgerufen werden können. Die ersten vier Aufrufe mit den Rückgabewerten von "i" bis "l" sind direkt nachvollziehbar. Beim fünften Aufruf sehen Sie einmal die Anwendung der "apply"-Methode von "add". Beachten Sie, dass die Eingabeparameter hier als Array zu übergeben sind. Es gibt noch eine "call"-Methode, die die Parameter einzeln entgegennimmt. Der erste Parameter der "apply"-Methode ist hier "null". An dieser Stelle kann man eine Referenz auf ein Objekt angeben, auf das die Funktion angewendet werden soll. Beachten Sie, dass in JavaScript auch ein Array ein Objekt ist! Hier sehen Sie ein Beispiel einer Funktion, die selbst eine Funktion beinhaltet. Sowohl die innere Funktion als auch die äußere haben einen return-Wert. Die innere Funktion kann auf die Parameter der äußeren Funktion zugreifen. Aus Sicht der Objektorientierung erinnert die äußere Funktion etwas an einen Klassen-Rumpf, während die innere Funktion eine Methode des Objektes repräsentiert. In dem Beispiel erhält a den Wert drei und b den Wert vier. Danach wird "innen-b" aufgerufen. B hat den Wert vier, sodass auch c den Wert vier erhält. Die innere Funktion rechnet dann drei plus vier gleich sieben und gibt dies zurück. Danach wird diese sieben auch von der äußeren Funktion zurückgegeben und dann via "print-line" ausgegeben. In diesem Beispiel sehen wir, dass die Eingabeparameter einer JavaScript-Funktion nicht fest vorgegeben sind. Über das Array mit dem Namen "arguments" kann man eine variable Anzahl von Eingabeparametern auslesen und verarbeiten. In diesem Beispiel werden alle Zahlen aufsummiert, zurückgegeben und in der Variablen "n" gespeichert. Abschließend erfolgt dann die Ausgabe des Ergebnisses. Hier sehen Sie einige wichtige Funktionen, die in JavaScript integriert sind. "eval" interpretiert übergebenen String als Code. Damit können Sie also dynamisch zur Laufzeit Quellcode erzeugen! "is-Finite" prüft auf gültigen Wertebereich und "is-nan" prüft auf ungültigen Wertebereich. "parse-Float" wandelt eine Zeichenkette in eine Fließkommazahl um und "parse-Int" in eine Ganzzahl. "Number" wandelt einen Wert in eine Zahl um und "String" wandelt einen Wert in eine Zeichenkette um. "encode-URI" wandelt eine Zeichenkette in das URI-Format um und "decode-URI" funktioniert andersherum. Die Funktionen sind wichtig, wenn Sie beispielsweise Benutzereingaben via HTTP-Get in der URL übertragen wollen. So sind beispielsweise Leerzeichen nicht zulässig und werden durch den Code Prozent-Zwanzig ersetzt. Die Funktion "to-Fixed" erzwingt eine Anzahl "n" an festen Nachkommastellen. Zum Abschluss hier noch ein Quellcode, der verschiedene JavaScript-Funktionen testet. Probieren Sie es aus, auch mit anderen Werten! Entsprechen die Ausgaben immer Ihren Erwartungen?.